package scream.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import scream.excepcion.DAOExcepcion;
import scream.util.ConexionBD;
import scream.modelo.Poder;

import scream.modelo.TipoProductoServicio;


public class PoderDAO {
	
	
	public Collection<Poder> buscarPorCodigo(String codigo) throws DAOExcepcion {
		System.out.println("PoderDAO: buscarPorCodigo(String codigo)");
		String query = "SELECT p.coPoder, p.noPoder,"+
						"tp.coTipoProductoServicio,tp.noTipoProductoServicio " +
						" FROM Poder p inner join TipoProductoServicio tp on " +
						" p.coTipoProductoServicio=tp.coTipoProductoServicio " + 
						" WHERE p.coPoder like ?";
		
		Collection<Poder> lista = new ArrayList<Poder>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + codigo + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Poder vo = new Poder();
				TipoProductoServicio tps=new TipoProductoServicio();
				
				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
				tps.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
				vo.setCoTipoProductoServicio(tps);
				
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	public Collection<Poder> buscarPorNombre(String noPoder) throws DAOExcepcion {
		System.out.println("PoderDAO: buscarPorCodigo(String codigo)");
//		String query = "SELECT p.coPoder, p.noPoder,p.coTipoEmpresa,"+
//						"te.noTipoEmpresa,ti.coTipoIntervencion, ti.noTipoIntervencion" +
//						" FROM Poder p inner join tipoempresa te on " +
//						" p.coTipoEmpresa=te.coTipoEmpresa " + 
//						" inner join tipointervencion ti on " + 
//						" p.TipoIntervencion_coTipoIntervencion= ti.coTipoIntervencion WHERE p.noPoder like ?";
		
		String query = "SELECT p.coPoder, p.noPoder,"+
		"tp.coTipoProductoServicio,tp.noTipoProductoServicio " +
		" FROM Poder p inner join TipoProductoServicio tp on " +
		" p.coTipoProductoServicio=tp.coTipoProductoServicio " + 
		" WHERE p.noPoder like ?";
		
		Collection<Poder> lista = new ArrayList<Poder>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + noPoder + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Poder vo = new Poder();
				
				
				TipoProductoServicio tps=new TipoProductoServicio();
				
				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
				tps.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
				vo.setCoTipoProductoServicio(tps);
				
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	private void cerrarConexion(Connection con) {
		// TODO Auto-generated method stub
		
	}

	private void cerrarStatement(PreparedStatement stmt) {
		// TODO Auto-generated method stub
		
	}

	private void cerrarResultSet(ResultSet rs) {
		// TODO Auto-generated method stub
		
	}

	public void insertar(Poder vo) throws DAOExcepcion {
		System.out.println("PoderDAO: insertar(Poder vo)");
		
		//HELEN: CORREGIR EN CASO LA TABLA PODER TENGA OTRO CAMPO
		//CAMBIAR: tipoIntervencion_coTipoIntervencion  ---> coTipoIntervencion
			
		String query = "INSERT INTO poder(coPoder,noPoder,coTipoProductoServicio) VALUES (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		
		if(obtenerPorNombreyTipoServicio(vo.getNoPoder(), vo.getCoTipoProductoServicio().getCoTipoProductoServicio())!=null){
			
			throw new DAOExcepcion("El poder " + vo.getNoPoder() + " ya existe en la bd para el tipo producto " + vo.getCoTipoProductoServicio().getCoTipoProductoServicio() + ".");
		}
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getCoPoder());
			stmt.setString(2, vo.getNoPoder());
			stmt.setString(3, vo.getCoTipoProductoServicio().getCoTipoProductoServicio());
			System.out.println(stmt.toString());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Poder obtenerPorNombreyTipoServicio(String noPoder,String coTipoProductoServicio) throws DAOExcepcion {
		System.out.println("PoderDAO: obtenerPorNombreyTipoServicio(String coPoder,String coTipoProductoServicio)");
		
		Poder vo =null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			//HELEN: CORREGIR EN CASO LA TABLA PODER TENGA OTRO CAMPO
			//CAMBIAR: tipoIntervencion_coTipoIntervencion  ---> coTipoIntervencion
			
			String query = "select coPoder,noPoder,coTipoProductoServicio from poder " + 
						"where noPoder=? and coTipoProductoServicio=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, noPoder);
			stmt.setString(2, coTipoProductoServicio);
			System.out.println(stmt.toString());
			rs = stmt.executeQuery();
			if (rs.next()) {
				 vo=new Poder();
				TipoProductoServicio tps=new TipoProductoServicio();
				
				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
				
				vo.setCoTipoProductoServicio(tps);
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Poder obtener(String coPoder) throws DAOExcepcion {
		System.out.println("PoderDAO: obtener(String coPoder)");
		Poder vo = new Poder();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//HELEN: CORREGIR EN CASO LA TABLA PODER TENGA OTRO CAMPO
			//CAMBIAR: tipoIntervencion_coTipoIntervencion  ---> coTipoIntervencion
			
			String query = "select coPoder,noPoder,coTipoProductoServicio from poder where coPoder=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, coPoder);
			rs = stmt.executeQuery();
			if (rs.next()) {
			
				TipoProductoServicio tps=new TipoProductoServicio();
				
				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
				
				vo.setCoTipoProductoServicio(tps);
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(String coPoder) throws DAOExcepcion {
		System.out.println("PoderDAO: eliminar(String coPoder)");
		String query = "DELETE FROM poder WHERE coPoder=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, coPoder);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizar(Poder vo) throws DAOExcepcion {
		System.out.println("PoderDAO: actualizar(Poder vo)");
		//HELEN: CORREGIR EN CASO LA TABLA PODER TENGA OTRO CAMPO
		//CAMBIAR: tipoIntervencion_coTipoIntervencion  ---> coTipoIntervencion
		
		String query = "update poder set noPoder=? , coTipoProductoServicio=?, " + 
						"  where coPoder=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNoPoder());
			stmt.setString(2, vo.getCoTipoProductoServicio().getCoTipoProductoServicio());
			stmt.setString(3, vo.getCoPoder());
				
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Poder> listar(String noPoder) throws DAOExcepcion {
		System.out.println("PoderDAO: listar()");
		Collection<Poder> c = new ArrayList<Poder>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			
			
//			String query ="SELECT p.coPoder, p.noPoder,p.coTipoEmpresa, "+
//			" te.noTipoEmpresa,ti.coTipoIntervencion, ti.noTipoIntervencion" +
//			" FROM Poder p inner join tipoempresa te on " +
//			" p.coTipoEmpresa=te.coTipoEmpresa " + 
//			" inner join tipointervencion ti on " + 
//			" p.TipoIntervencion_coTipoIntervencion = ti.coTipoIntervencion WHERE p.noPoder like ?";

			String query = "SELECT p.coPoder, p.noPoder,"+
			"tp.coTipoProductoServicio,tp.noTipoProductoServicio " +
			" FROM Poder p inner join TipoProductoServicio tp on " +
			" p.coTipoProductoServicio=tp.coTipoProductoServicio " + 
			" WHERE p.noPoder like ?";
			
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + noPoder + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Poder vo = new Poder();
				TipoProductoServicio tps=new TipoProductoServicio();
				
				vo.setCoPoder(rs.getString("coPoder"));
				vo.setNoPoder(rs.getString("noPoder"));
				tps.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
				tps.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
				vo.setCoTipoProductoServicio(tps);
				
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	

}
